#!/usr/bin/perl

#
# Filtiert alle ("sichere") Komposita aus dem Lexikon heraus.
# Verwendung:
# ./filter_lexicon.pl < split-results > filtered-lexicon
#
# Wobei:
#  * "split-results" ist der Ergebnis der Analyse von einem Lexikon
#  * "filtered-lexikon" ist dieser Lexikon, ohne Wörter, die durch die
#    Analyse als Komposita erkannt wurden

use strict; 
use warnings; 
use utf8;

# minimale Länge der anerkannten Kompositenteile
use constant MIN_LEN => 4;

#
# FUNKTIONEN
#


# Nimmt ein Wort und alle seine Analysen und entscheidet, ob das
# Wort ein Kompositum ist (d.h. es gibt eine Analyse mit mehr als 1 Teil,
# wo alle Teile lang genug sind).
sub judge {

    my $word = shift();
    my @analyses = @{shift()};

    foreach my $analysis (@analyses){

        my $num_parts = 0;        

        while($analysis =~ m/\[([^\]]+)\](\+[^\[\(]+)/g){
           
            $num_parts++;            
            my $part_length = length($1);
            
            if ($2 eq "+Noun-e"){
                $part_length--;
            }
            elsif ($2 eq "+Verb+Stem"){
                $part_length -= 2;
            }
            if ($part_length < MIN_LEN){ # Teil nicht lang genug -> überspringen
                $num_parts = 0;
                last;
            }
        }
        if ($num_parts > 1){ # sicher ein Kompositum
            return 1;
        }
    }
    return 0;
}

#
# MAIN
#

my $beg = 1;
my $cur_word;
my @analyses;

while (<>){
    
    $_ =~ s/\r?\n$//;

    if (($_ eq "") && ($beg == 0)){
        
        if (!judge($cur_word, \@analyses)){ # kein Kompositum -> ausdrucken
            print($cur_word . "\n");
        }
        @analyses=();
        $beg = 1;
        next;
    }

    if ($_ ne ""){
        if ($beg){
            $cur_word = $_;
            $beg = 0;
        }
        else {
            push(@analyses, $_);
        }
    }
}

